﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include <string>
#include <functional>
#include "OwnerPtr.h"
#include "GcmpSkpInterface.h"
#include "GcmpApiDeclaration.h"

namespace gcmp
{
    /// \brief SketchUp文件导入对象（支持到2017版）
    ///
    class GCMP_SKP_INTERFACE_EXPORT ISkpImporter
    {
    public:
        /// \brief 单位
        enum class Units : int32_t
        {
            Inches,         ///< 英寸
            Feet,           ///< 英尺
            Miles,          ///< 英里
            MilliMeters,    ///< 毫米
            CentiMeters,    ///< 厘米
            Meters,         ///< 米
            KiloMeters     ///< 千米
        };

        /// \brief 从本地磁盘的SketchUp文件创建模型的返回值
        enum class SkpResult : int32_t
        {
            SKP_ERROR_NONE = 0, ///< 成功

            SKP_ERROR_NULL_POINTER_INPUT = 1, ///< 所需输入的指针为 NULL

            SKP_ERROR_INVALID_INPUT = 2, ///< 参数输入无效

            SKP_ERROR_NULL_POINTER_OUTPUT = 3, ///< 所需输出的指针为空

            SKP_ERROR_INVALID_OUTPUT = 4, ///< 未正确创建要使用函数输出编写的API对象

            SKP_ERROR_OVERWRITE_VALID = 5, ///< 表示输入对象引用已经引用了预期为\ref SU_INVALID的对象

            SKP_ERROR_GENERIC = 6, ///< 表示未指定的错误

            SKP_ERROR_SERIALIZATION = 7, ///< 表示在加载或保存文件期间发生错误

            SKP_ERROR_OUT_OF_RANGE = 8, ///< 输入包含了超出允许值范围的值

            SKP_ERROR_NO_DATA = 9, ///< 请求的操作没有要返回给用户的数据，通常发生在请求仅在条件下可用的数据时

            SKP_ERROR_INSUFFICIENT_SIZE = 10, ///< 表示输出参数的大小不够

            SKP_ERROR_UNKNOWN_EXCEPTION = 11, ///< 发生未知异常。

            SKP_ERROR_MODEL_INVALID = 12, ///< 请求的模型无效，无法加载

            SKP_ERROR_MODEL_VERSION = 13, ///< 由于版本无效，无法加载或保存模型

            SKP_ERROR_LAYER_LOCKED = 14, ///< 正在修改的图层被锁定

            SKP_ERROR_DUPLICATE = 15,   ///< 用户请求的操作会导致重复数据。

            SKP_ERROR_PARTIAL_SUCCESS = 16,  ///< 请求的操作未完全完成，但返回了中间成功结果

            SKP_ERROR_UNSUPPORTED = 17, ///< 不支持的请求操作

            SKP_ERROR_INVALID_ARGUMENT = 18 ///< 参数包含无效信息
        };
    public:
        typedef gcmp::OwnerPtr<ISkpImporter> (*SkpImporterCreateFunc)();

        virtual ~ISkpImporter() {}

        /// \brief 加载SketchUp文件
        /// \param sketchUpFilePath skp文件路径
        /// \param skpResult SketchUp文件创建模型的返回结果
        /// \return 读取成功返回true,否则返回fasle
        virtual bool Load(const std::wstring& sketchUpFilePath, SkpResult& skpResult) = 0;

        /// \brief 加载SketchUp文件
        /// \param sketchUpFilePath skp文件路径
        /// \param familyFilePath 生成的族文件路径
        /// \param skpResult SketchUp文件创建模型的返回结果
        /// \return 读取成功返回true,否则返回fasle
        virtual bool Load(const std::wstring& sketchUpFilePath, std::wstring& familyFilePath, SkpResult& skpResult) = 0;

        /// \brief 设置模型单位 
        /// \param unit 模型单位
        virtual void SetModelUnit(Units unit) = 0;

        /// \brief 创建Skp文件导入对象
        /// \return  Skp文件导入对象
        static OwnerPtr<ISkpImporter> Create();
    public:
        /// \brief 设置skp文件导入对象创建函数 
        /// \param func skp文件导入对象创建函数
        /// \note  平台内部有默认实现，如需自定义可以调用此函数
        static void SetSkpImporterCreateFunc(SkpImporterCreateFunc func);

        GCMP_OBSOLETE_API(2021/12/01, ISkpImporter::Load(const std::wstring&, SkpResult&))
            virtual bool ISkpImporter::Load(const std::wstring& sketchUpFilePath) = 0;

        GCMP_OBSOLETE_API(2021/12/01, ISkpImporter::Load(const std::wstring&, std::wstring&, SkpResult&))
            virtual bool ISkpImporter::Load(const std::wstring& sketchUpFilePath, std::wstring& familyFilePath) = 0;

    };
}
